home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / tex / td187src.lzh / HELPMODU.I < prev    next >
Text File  |  1991-12-14  |  10KB  |  330 lines

  1. IMPLEMENTATION MODULE HelpModule ;
  2. FROM SYSTEM     IMPORT  ADR, ADDRESS;
  3. FROM Storage    IMPORT  ALLOCATE, DEALLOCATE;
  4. FROM MagicAES   IMPORT  OBJECT, RsrcGaddr, RTREE, DISABLED;
  5. FROM WinUtils   IMPORT  SetWinInfo;
  6. IMPORT CommonData;
  7. IMPORT Dialoge;
  8. IMPORT Diverses;
  9. IMPORT FileIO;
  10. IMPORT GetFile;
  11. IMPORT MagicStrings;
  12. IMPORT MagicSys;
  13. IMPORT RSCindices;
  14. (**
  15. IMPORT RTD;
  16. **)
  17. CONST InfoSize     = 65;
  18.       HelpSize     = 41;
  19.       SizeSize     = 20;
  20.       FlagSize     = 4;
  21.       IconHelpFile = 'tdhelp.??';
  22. VAR Last   : ARRAY [0..255] OF CHAR;
  23.     Flag   : ARRAY [0..19]   OF CHAR;
  24.     Size   : ARRAY [0..255]  OF CHAR;
  25.     txt    : ARRAY [0..255]  OF CHAR;
  26.  
  27. PROCEDURE DisplayString;
  28. VAR i   : INTEGER;
  29.     pxy : ARRAY [0..3] OF INTEGER;
  30. BEGIN
  31.   FOR i:=0 TO InfoSize-1 DO txt[i] := ' '; END;
  32.   txt[InfoSize] := 0C;
  33.   i := 0;
  34.   WHILE (i<FlagSize) AND (Flag[i]<>0C) DO
  35.     txt[i] := Flag[i];
  36.     INC(i, 1);
  37.   END;
  38.   i := 0;
  39.   WHILE (i<HelpSize) AND (Last[i]<>0C) DO
  40.     txt[i + FlagSize] := Last[i];
  41.     INC(i, 1);
  42.   END;
  43.   i := 0;
  44.   WHILE (i<SizeSize) AND (Size[i]<>0C) DO
  45.     txt[i + FlagSize + HelpSize] := Size[i];
  46.     INC(i, 1);
  47.   END;
  48.   SetWinInfo(CommonData.WindowHandle, txt);
  49. END DisplayString;
  50.  
  51. PROCEDURE DisplayStatus(txt : ARRAY OF CHAR);
  52. (*
  53.    Zeigt im Fenstertitel ein Statusflag an (max. 3 Zeichen)
  54. *)
  55. VAR i       : CARDINAL;
  56.     adr     : ARRAY [0..3] OF INTEGER;
  57. BEGIN
  58.   i := 0;
  59.   WHILE (i<FlagSize) AND (i<=HIGH(txt)) AND (txt[i]<>0C) DO
  60.     Flag[i] := txt[i];
  61.     INC(i, 1);
  62.   END;
  63.   DisplayString;
  64. END DisplayStatus;
  65.  
  66. PROCEDURE LastHelpMessage;
  67. (* Gibt Inhalt von Last aus *)
  68. VAR i, xp, yp, x, y, w, h, top : INTEGER;
  69.     pxy : ARRAY [0..3] OF INTEGER;
  70. BEGIN
  71.   IF MagicStrings.Length(Last)> HelpSize THEN
  72.     Last[HelpSize-3] := '.';
  73.     Last[HelpSize-2] := '.';
  74.     Last[HelpSize-1] := '.';
  75.     Last[HelpSize  ] := 0C;
  76.   END;
  77.   DisplayString;
  78. END LastHelpMessage;
  79.  
  80. PROCEDURE WinSize(text : ARRAY OF CHAR);
  81. BEGIN
  82.   MagicStrings.Assign(text, Size);
  83.   DisplayString;
  84. END WinSize;
  85.  
  86. PROCEDURE HelpMessage(text : ARRAY OF CHAR);
  87. BEGIN
  88.   MagicStrings.Assign(text, Last);
  89.   LastHelpMessage;
  90. END HelpMessage;
  91.  
  92. PROCEDURE HelpFile(HelpNr : INTEGER);
  93. TYPE chset       = SET OF CHAR;
  94. CONST helplines = 13;
  95.       querverw  = 7;
  96.       maxlines  = 200;
  97. VAR filename    : ARRAY [0..255] OF CHAR;
  98.     hlpline     : ARRAY [0..maxlines-1] OF ARRAY [0..79] OF CHAR;
  99.     null        : ARRAY [0..19] OF CHAR;
  100.     quer        : ARRAY [0..querverw-1] OF INTEGER;
  101.     helphandle  : INTEGER;
  102.     i, j, lines : INTEGER;
  103.     start, end  : INTEGER;
  104.     activepage  : INTEGER;
  105.     helpnr      : INTEGER;
  106.     prev, next  : BOOLEAN;
  107.     endofhelp   : BOOLEAN;
  108.     Tree1,
  109.     Tree2,
  110.     Tree3       : POINTER TO ARRAY [0..127] OF OBJECT;
  111.     num         : chset;
  112. BEGIN
  113.   helpnr := HelpNr;
  114.   Tree1  := RsrcGaddr( RTREE , RSCindices.helpscrn ) ;
  115.   Tree2  := RsrcGaddr( RTREE , RSCindices.icons ) ;
  116.   Tree3  := RsrcGaddr( RTREE , RSCindices.desktop ) ;
  117.   num    := chset{'0'..'9'};
  118.   REPEAT
  119.     endofhelp := TRUE;
  120.     (* Zunächst alle Querverweise disablen *)
  121.     FOR i:=0 TO querverw-1 DO
  122.       quer[i] := 0;
  123.       Tree1^[ RSCindices.quer1+i ].ImagePtr := Tree2^[ RSCindices.empty ].ImagePtr ;
  124.       INCL(Tree1^[ RSCindices.quer1+i ].obState,  DISABLED);
  125.     END;
  126.     FOR i:=0 TO maxlines-1 DO hlpline[i] := ' '; END;
  127.     MagicStrings.Assign(IconHelpFile, null);
  128.     null[7] := CHR(ORD('0') + MagicSys.CastToCard(helpnr DIV 10));
  129.     null[8] := CHR(ORD('0') + MagicSys.CastToCard(helpnr MOD 10));
  130.     IF CommonData.HelpPath[0]<>0C THEN
  131.       MagicStrings.Assign(CommonData.HelpPath, filename);
  132.       MagicStrings.Append(null, filename);
  133.      ELSE
  134.       MagicStrings.Assign(null, filename);
  135.     END;
  136.     null        := '      ';
  137.     IF GetFile.FileExists(filename) THEN
  138.       FileIO.Reset(helphandle, filename);
  139.       lines := 0;
  140.       FileIO.ReadLn(helphandle, hlpline[lines]);
  141.       IF hlpline[0,0] = '_' THEN
  142.         (* Jetzt suche die Nummern der Querverweisobjekte *)
  143.         j := 0;
  144.         i := 1;
  145.         REPEAT
  146.           WHILE (hlpline[0,i]=' ') DO INC(i); END;
  147.           IF (hlpline[0,i] IN num) AND (hlpline[0,i+1] IN num) THEN
  148.             quer[j] := 10 * (ORD(hlpline[0,i]) - ORD('0')) +
  149.                            (ORD(hlpline[0,i+1]) - ORD('0'));
  150.             Tree1^[ RSCindices.quer1+j ].ImagePtr :=
  151.                 Tree3^[ RSCindices.text + quer[j]-1 ].ImagePtr ;
  152.             EXCL(Tree1^[ RSCindices.quer1+j ].obState,  DISABLED);
  153.            ELSE
  154.             j := querverw;
  155.           END;
  156.           INC(j);
  157.           INC(i,2);
  158.         UNTIL j>=querverw;
  159.         hlpline[0] := ' ';
  160.        ELSE
  161.         IF (hlpline[lines,0] = '.') THEN
  162.           hlpline[lines,0]  := ' ';
  163.           hlpline[lines,1]  := 0C;
  164.         END;
  165.         INC(lines);
  166.       END;
  167.       WHILE (lines<maxlines) AND (NOT FileIO.EOF) DO
  168.         FileIO.ReadLn(helphandle, hlpline[lines]);
  169.         IF (hlpline[lines,0] = '.') THEN
  170.           hlpline[lines,0]  := ' ';
  171.           hlpline[lines,1]  := 0C;
  172.         END;
  173.         INC(lines);
  174.       END;
  175.       FileIO.Close(helphandle);
  176.       start := 0;
  177.       end   := helplines-1;
  178.       activepage := 0;
  179.       REPEAT
  180.         FOR i:=0 TO helplines-1 DO
  181.           Tree1^[RSCindices.help01+i].StringPtr  := ADR(null);
  182.         END;
  183.         i     := 0;
  184.         start := 0;
  185.         j     := 0;
  186.         WHILE (j<activepage) AND (i<lines) DO
  187.           IF hlpline[i,0] = '#' THEN
  188.             INC(j);
  189.             start := i + 1;
  190.            ELSE
  191.             IF (i-start=helplines) THEN
  192.               INC(j);
  193.               start := i;
  194.             END;
  195.           END;
  196.           INC(i);
  197.         END;
  198.         end := start + helplines - 1;
  199.         IF end>lines THEN
  200.           end := lines;
  201.         END;
  202.         i := 0;
  203.         WHILE (start+i<=end) DO
  204.           IF hlpline[start+i,0] = '#' THEN
  205.             end := start + i;
  206.             i := end;
  207.            ELSE
  208.             Tree1^[RSCindices.help01+i].StringPtr := ADR(hlpline[start+i]);
  209.           END;
  210.           INC(i);
  211.         END;
  212.         prev := start>0;
  213.         next := end<lines-1;
  214.         j := Dialoge.ShowHelp(prev, next);
  215.         IF (j = RSCindices.prevscrn) THEN
  216.           IF (activepage>0) THEN
  217.             DEC(activepage);
  218.           END;
  219.         END;
  220.         IF (j = RSCindices.nextscrn) THEN
  221.           INC(activepage);
  222.         END;
  223.       UNTIL (j <> RSCindices.prevscrn) AND (j <> RSCindices.nextscrn);
  224.       IF (j>=RSCindices.quer1) AND (j<=RSCindices.quer7) THEN
  225.         helpnr := quer[j-RSCindices.quer1];
  226.         endofhelp := FALSE;
  227.       END;
  228.     END;
  229.   UNTIL endofhelp;
  230. END HelpFile;
  231.  
  232. PROCEDURE HelpForIcon(nr, FillState, TextState, FontState : INTEGER;
  233.                       short : BOOLEAN);
  234. (*
  235.    Zeigt für das übergebene Icon den entsprechenden Hilfstext an.
  236.    Zusätzlich wird der momentane Fill-, Text- und Font-Status über-
  237.    geben (da davon manche Texte abhängen).
  238. *)
  239. VAR text : ARRAY [0..127] OF CHAR;
  240.     shelp, lhelp : INTEGER;
  241. BEGIN
  242.   text  := '';
  243.   shelp := -1;
  244.   lhelp  := 0;
  245.   IF short THEN
  246.     CASE nr OF
  247.       RSCindices.spline   : shelp := 17; |
  248.       RSCindices.polygspl : shelp := 18; |
  249.       RSCindices.bezier   : shelp := 19; |
  250.       RSCindices.bezielli : shelp := 20; |
  251.       RSCindices.text     :
  252.                             IF FontState = 0 THEN
  253.                               CASE TextState OF
  254.                                0: shelp := 21; |
  255.                                1: shelp := 22; |
  256.                                2: shelp := 23; |
  257.                                3: shelp := 24; |
  258.                                ELSE
  259.                               END;
  260.                              ELSE
  261.                               CASE TextState OF
  262.                                0: shelp := 25; |
  263.                                1: shelp := 26; |
  264.                                2: shelp := 27; |
  265.                                3: shelp := 28; |
  266.                                ELSE
  267.                               END;
  268.                             END;